<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文用户手册: 编辑多个文件</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/usr_07.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>usr_07</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="usr_07.txt">usr_07.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2020年3月

                     <code class="vim">VIM 用户手册 - by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Nek_in

                          编辑多个文件


无论你有多少个文件，你都可以同时编辑它们而不需要退出 Vim。本章介绍如何定义一个
文件列表，并基于这个列表工作，或者从一个文件跳转到另一个文件，又或者从一个文件
中拷贝文字，并写入到另一个文件中。

 <a href="usr_07.html#07.1">07.1</a>   编辑另一个文件
 <a href="usr_07.html#07.2">07.2</a>   文件列表
 <a href="usr_07.html#07.3">07.3</a>   从一个文件中跳到另一个文件
 <a href="usr_07.html#07.4">07.4</a>   备份文件
 <a href="usr_07.html#07.5">07.5</a>   文件间拷贝
 <a href="usr_07.html#07.6">07.6</a>   显示文件
 <a href="usr_07.html#07.7">07.7</a>   修改文件名

        下一章:  <a href="usr_08.html#usr_08.txt">usr_08.txt</a>   分割窗口
        前一章:  <a href="usr_06.html#usr_06.txt">usr_06.txt</a>   使用语法高亮
          目录:  <a href="usr_toc.html#usr_toc.txt">usr_toc.txt</a> 

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.1">07.1</a> </b>  编辑另一个文件</h4>
在本章前，你都是为每一个文件启动一次 Vim 的。实际上还有其它办法。如下命令就可
以在 Vim 中打开另一个文件: 
<code class="example"></code>
<code class="example">        :edit foo.txt</code>
<code class="example"></code>
你可以用任何其它文件名取代上面的 "foo.txt"。Vim 会关闭当前文件并打开另一个。但
如果当前文件被修改过而没有存盘， Vim 会显示错误信息而不会打开这个新文件:

<code class="section">        E37: No write since last change (use ! to override) </code>

        (<code class="vim">译者注</code>: 在中文状态下显示:

<code class="section">        E37: 已修改但尚未保存 (可用 ! 强制执行) </code>

        )

        <code class="note">备注</code>:
        Vim 在每个错误信息的前面都放了一个错误号。如果你不明白错误信息的意思，
        可以从帮助系统中获得更详细的说明。对本例而言: 
<code class="example"></code>
<code class="example">                :help E37</code>
<code class="example"></code>
出现上面的情况，你有多个解决方案。首先你可以通过如下命令保存当前文件: 
<code class="example"></code>
<code class="example">        :write</code>
<code class="example"></code>
或者，你可以强制 Vim 放弃当前修改并编辑新的文件。这时应该使用强制修饰符 (!) :

<code class="example">        :edit! foo.txt</code>
<code class="example"></code>
如果你想编辑另一个文件，但又不想马上保存当前文件，可以隐藏它:

<code class="example">        :hide edit foo.txt</code>
<code class="example"></code>
原来的文件还在那里，只不过你看不见。这将在 " <a href="usr_22.html#22.4">22.4</a> : 缓冲区列表" 中解释。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.2">07.2</a> </b>  文件列表</h4>
你可以在启动 Vim 的时候指定一堆文件。例如:

<code class="example">        vim one.c two.c three.c</code>
<code class="example"></code>
这个命令启动 Vim 并告诉它你要编辑三个文件。Vim 只显示第一个。等你编辑完第一个
以后，用如下命令可以编辑第二个:

<code class="example">        :next</code>
<code class="example"></code>
如果你在当前文件中有未保存的修改，你会得到一个错误信息而无法编辑下一个文件。这
个问题与前一节执行 ":edit" 命令的问题相同。要放弃当前修改:

<code class="example">        :next!</code>
<code class="example"></code>
但大多数情况下，你需要保存当前文件再进入下一个。这里有一个特殊的命令:

<code class="example">        :wnext</code>
<code class="example"></code>
这相当于执行了两个命令:

<code class="example">        :write</code>
<code class="example">        :next</code>
<code class="example"></code>
<code class="example"></code>
我 在 哪 ？

要知道当前文件在文件列表中的位置，可以<code class="note">注意</code>一下文件的标题。那里应该显示类似
"(2 of 3)" 的字样。这表示你正在编辑三个文件中的第二个。
    如果你要查看整个文件列表，使用如下命令:

<code class="example">        :args</code>
<code class="example"></code>
这是 "arguments" (参数) 的缩写。其输出应该像下面这样:

<code class="section">        one.c [two.c] three.c </code>

这里列出所有你启动 Vim 时指定的文件。你正在编辑的那一个，例如，"two.c"，会用中
括号括起。


移 动 到 另 一 个 参 数

要回到前一个文件:

<code class="example">        :previous</code>
<code class="example"></code>
这个命令与 ":next" 相似，只不过它是向相反的方向移动。同样地，这个命令有一个快
捷版本用于 "保存再移动":

<code class="example">        :wprevious</code>
<code class="example"></code>
要移动到列表中的最后一个文件:

<code class="example">        :last</code>
<code class="example"></code>
而要移动到列表中的第一个文件:

<code class="example">        :first</code>
<code class="example"></code>
不过，可没有 ":wlast" 或者 "wfirst" 这样的命令了。

你可以在 ":next" 和 ":previous" 前面加计数前缀。例如要向后跳两个文件:

<code class="example">        :2next</code>
<code class="example"></code>
<code class="example"></code>
自 动 保 存

当你在多个文件间跳来跳去进行修改，你要老记着用 ":write" 保存文件。否则你就会得
到一个错误信息。 如果你能确定你每次都会将修改存盘的话，你可以让 Vim 自动保存文
件:

<code class="example">        :set autowrite</code>
<code class="example"></code>
如果你编辑一个你不想自动保存的文件，你可以把功能关闭:

<code class="example">        :set noautowrite</code>
<code class="example"></code>
<code class="example"></code>
编 辑 另 一 个 文 件 列 表

你可以编辑另一个文件列表而不需要退出 Vim。用如下命令编辑另三个文件:

<code class="example">        :args five.c six.c seven.h</code>
<code class="example"></code>
或者使用通配符，就像在控制台上一样:

<code class="example">        :args *.txt</code>
<code class="example"></code>
Vim 会跳转到列表中的第一个文件。同样地，如果当前文件没有保存，你需要保存它，或
者使用 ":args!" (加了一个 !) 放弃修改。


你 编 辑 了 最 后 一 个 文 件 吗 ？
                                                        <b class="vimtag"> <a name="arglist-quit">arglist-quit</a> </b>
当你使用了文件列表，Vim 假定你想编辑全部文件，为了防止你提前退出，如果你还没有
编辑过最后一个文件。当你退出的时候，Vim 会给如下错误信息:

<code class="example">        E173: 46 more files to edit</code>
<code class="example"></code>
如果你确实需要退出，再执行一次这个命令就行了 (但如果在两个命令间还执行了其它命
令就无效了)。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.3">07.3</a> </b>  从一个文件跳到另一个文件</h4>
要在两个文件间快速跳转，按 <code class="keystroke">CTRL-^</code> (美式英语键盘中 ^ 6 的上面)。例如:

<code class="example">        :args one.c two.c three.c</code>
<code class="example"></code>
现在你在 one.c。

<code class="example">        :next</code>
<code class="example"></code>
现在你在 two.c。现在使用 <code class="keystroke">CTRL-^</code> 回到 one.c。再按一下 <code class="keystroke">CTRL-^</code> 则回到 two.c。又按
一下 <code class="keystroke">CTRL-^</code> 你再回到 one.c。如果你现在执行:

<code class="example">        :next</code>
<code class="example"></code>
现在你在 three.c。<code class="note">注意</code> <code class="keystroke">CTRL-^</code> 不会改变你在文件列表中的位置。只有 ":next" 和
":previous" 才能做到这点。

你编辑的前一个文件称为 "轮换" 文件。如果你启动 Vim 而 <code class="keystroke">CTRL-^</code> 不起作用，那可能
是因为你没有轮换文件。

预 定 义 标 记

当你跳转到另一个文件后，有两个预定义的标记非常有用:

<code class="example">        `"</code>
<code class="example"></code>
这个标记使你跳转到你上次离开这个文件时的位置。
另一个标记记住你最后一次修改文件的位置:

<code class="example">        `.</code>
<code class="example"></code>
假设你在编辑 "one.txt"，在文件中间某个地方你用 "x" 删除一个字符，接着用 "G" 命
令移到文件末尾，然后用 "w" 存盘。然后你又编辑了其它几个文件。你现在用 ":edit
one.txt" 回到 "one.txt"。如果现在你用 `"，Vim 会跳转到文件的最后一行；而用 `.
则跳转到你删除字符的地方。即使你在文件中移动过，但在你修改或者离开文件前，这两
个标记都不会改变。


文 件 标 记

在  <a href="usr_03.html#03.10">03.10</a>  一节，我们介绍过使用 "mx" 命令在文件中增加标记，那只在一个文件中有
效。如果你编辑另一个文件并在那里加了标记，这些标记都是这个文件专用的。这样，每
个文件都有一个自己的标记集，并只能在该文件中使用。
    到此为止，我们都用小写字母的标记。实际上还可以使用大写字母标记，这种标记是
全局的，它们可以在任何文件中使用。例如，你在编辑一个文件 "foo.txt"。在文件的中
间 (50%) 并建立一个 J 标记 (J 表示甲):

<code class="example">        50%mJ</code>
<code class="example"></code>
现在编辑文件 "bar.txt" 并在文件的最后一行放一个标记 Y (Y 表示乙):

<code class="example">        GmY</code>
<code class="example"></code>
现在你可以使用 "`J" 命令跳回到 foo.txt 的中间。或者在另一个文件中输入 "`Y" 跳
回到 bar.txt 的末尾。

文件标记会被一直记住直到被重新定义。这样，你可以在一个文件中留下一个标记，然后
任意做一段时间的编辑，最后用这个标记跳回去。
    让文件标记符和对应的位置建立一些关系常常是很有用的。例如，用 H 表示头文件
(Head File)，M 表示 Makefile 而 C 表示 C 的代码文件。

要知道一个标记在什么地方，在 ":marks" 命令中加上标记名作为参数即可:

<code class="example">        :marks M</code>
<code class="example"></code>
你还可以带多个参数:

<code class="example">        :marks MCP</code>
<code class="example"></code>
别忘了你还可以 <code class="keystroke">CTRL-O</code> 和 <code class="keystroke">CTRL-I</code> 在整个跳转序列中前后跳转。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.4">07.4</a> </b>  备份文件</h4>
通常 Vim 不会产生备份文件。如果你希望的话，执行如下命令就可以了:

<code class="example">        :set backup</code>
<code class="example"></code>
备份文件的文件名是在原始文件的后面加上一个 ~ 。如果你的文件名是 data.txt，则备
份文件的文件名就是 data.txt~ 。
    如果你不喜欢这个名字，你可以修改扩展名:

<code class="example">        :set backupext=.bak</code>
<code class="example"></code>
这会使用 data.txt.bak 而非 data.txt~。
    还有一个相关选项是 <a href="options.html#'backupdir'">'backupdir'</a>。它指定备份文件的目录。默认情况是与原始文件
的路径一致，这在很多情况下都是合适的。

        <code class="note">备注</code>:
        如果 <a href="options.html#'backup'">'backup'</a> 选项没有置位而 <a href="options.html#'writebackup'">'writebackup'</a> 选项置了位，Vim 还是会创建
        备份文件的。但在文件编辑完后，这个备份文件会被自动删除。这个功能用于避
        免发生异常情况导致没有存盘 (磁盘满是最常见的情况；被雷击也是一种情况，
        不过很少发生)。


保 留 原 始 文 件

如果你在编辑源程序，你可能想在修改之前保留一个备份。但备份文件会在你存盘的时候
被覆盖。这样它只能保留前一个版本，而不是最早的文件。
    要让 Vim 保存一个原始的文件，可以设置 <a href="options.html#'patchmode'">'patchmode'</a> 选项。这个选项定义需要改
动文件的第一个备份文件的扩展名。通常可以这样设:

<code class="example">        :set patchmode=.orig</code>
<code class="example"></code>
这样，当你第一次编辑 data.txt，作了修改并执行存盘，Vim 会保留一个名为
"data.txt.orig" 的原始文件。
    如果你接着修改这个文件，Vim 会发现这个原始文件已经存在，并不再覆盖它。进一
步的备份就存在 "data.txt~" (或者你设置的 <a href="options.html#'backupext'">'backupext'</a> 指定的文件) 中。
    如果你让 <a href="options.html#'patchmode'">'patchmode'</a> 设为空 (这是默认的情况)，则原始文件不会被保留。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.5">07.5</a> </b>  文件间拷贝文本</h4>
本节解释如何在文件间拷贝文本。我们从一个简单的例子开始。编辑一个你要拷贝文本的
文件，把光标移到要拷贝的文本的开始处，用 "v" 命令启动可视模式，然后把光标移到
要拷贝文本的结尾处，输入 "y" 拷贝文本。
    例如，要拷贝上面这段文字，你可以执行:

<code class="example">        :edit thisfile</code>
<code class="example">        /本节解释</code>
<code class="example">        vjjj$y</code>
<code class="example"></code>
现在编辑你要粘贴文本的文件。把光标移到你要插入文本的地方。用 "p" 命令把文本粘
贴到那里:

<code class="example">        :edit otherfile</code>
<code class="example">        /There</code>
<code class="example">        p</code>
<code class="example"></code>
当然，你可以用任何命令拷贝文本。例如，用 "V" 命令选中整行的内容。或者用 <code class="keystroke">CTRL-V</code>
选择一个矩形列块。或者使用 "Y" 拷贝一个单行，"yaw" 拷贝一个单词等。
    "p" 命令把文本粘贴到光标之后，"P" 命令则粘贴到光标之前。<code class="note">注意</code>， Vim 会记住
你拷贝的是一整行还是一个列块，并用相同的方式把文本贴出来。


使 用 寄 存 器

当你需要拷贝一个文件的几个地方到另一个文件，用上面的方法，你就得反复在两个文件
间跳来跳去。要避免这种情况，你可以把不同的文本拷贝到不同的寄存器中。
    寄存器是 Vim 用来保存文本的地方。这里我们使用名称为 a 到 z 的寄存器 (后面
我们会发现还有其它寄存器)。让我们拷贝一个句子到 f 寄存器 (f 表示 First):

<code class="example">        "fyas</code>
<code class="example"></code>
"yas" 命令像以前说过的那样拷贝一个句子，而 "f 告诉 Vim 把文本拷贝到寄存器 f 。
这必须放在拷贝命令的前面。
    现在，拷贝三个整行到寄存器 l (l 表示 line):

<code class="example">        "l3Y</code>
<code class="example"></code>
计数前缀也可以用在 "l 的前面。要拷贝一个文本列块到寄存器 b (代表 block) 中:

<code class="example">        CTRL-Vjjww"by</code>
<code class="example"></code>
<code class="note">注意</code> "b 正好在 "y" 命令的前面，这是必须的。把它放在 "w" 命令的前面就不行。
    现在你有了在寄存器 f，l 和 b 有三段文本。编辑另一个文件，并移到要插入文本
的地方:

<code class="example">        "fp</code>
<code class="example"></code>
同样地，寄存器标识符 "f 必须在 "p" 命令的前面。
    你可以用任何顺序粘贴寄存器的内容。并且，这些内容一直存在于寄存器中，直到你
拷贝其它文件到这个寄存器中。这样，你可以粘贴任意多次。

    删除文本的时候，你也可以指定寄存器。使用这个方法可以移动几处文本。例如，要
删除一个单词并写到 w 寄存器中:

<code class="example">        "wdaw</code>
<code class="example"></code>
同样地，寄存器标识符必须在删除命令 "d" 的前面。


添 加 到 文 件

当你要在几个文件中收集文本，你可以用这个命令:

<code class="example">        :write &gt;&gt; logfile</code>
<code class="example"></code>
这个命令将文本写入到文件的末尾。这样实现了文件添加功能。这样使你免去了拷贝，编
辑和拷贝的过程，省了两步。但你只能加到目标文件的末尾。
    要只拷贝一部分内容，可以先用可视模式选中这些内容后在执行 ":write"。在第 10
章，你将学会选中一个行范围的办法。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.6">07.6</a> </b>  显示文件</h4>
有时，你只是想查看一个文件，而没打算修改它。有一个风险是你想都没想就输入了一个
"w" 命令。要避免这个问题，以只读模式编辑这个文件。
    要用只读模式启动 Vim，可以使用这个命令:

<code class="example">        vim -R file</code>
<code class="example"></code>
在 Unix，如下命令可以完成相同的功能:

<code class="example">        view file</code>
<code class="example"></code>
现在，你就在用只读模式阅读这个文件 "file" 了。但你执行 ":w" 命令的时候，你会得
到一个禁止写入的错误信息。
    当你试图修改这个文件时，Vim 会给你一个告警提示:

<code class="section">        W10: Warning: Changing a readonly file </code>

即使这样，你的修改还是会被接纳的。有可能你只是想排列这些文本，以便阅读。
    如果你确实要改动这个文件，在 write 命令前面加上 ! 可以强制写入。

如果你的确想禁止文件修改，用这个命令:

<code class="example">        vim -M file</code>
<code class="example"></code>
现在任何对文件的修改操作都会失败。例如，帮助文件就是这样的。如果你要在上面作修
改，你会得到一个错误提示:

<code class="section">        E21: Cannot make changes, <a href="options.html#'modifiable'">'modifiable'</a> is off </code>

你可以设置 -M 参数使 Vim 工作在只读模式。这个方式仍然取决于用户的意愿，因为你
可以用下面的命令去掉这层保护:

<code class="example">        :set modifiable</code>
<code class="example">        :set write</code>

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="07.7">07.7</a> </b>  修改文件名</h4>
编辑一个新文件的一个比较聪明的做法是使用一个现存的、其中大部分内容你都需要的文
件。例如，你要写一个移动文件的程序，而你已经有一个用于拷贝的程序了，这样可以这
样开始:

<code class="example">        :edit copy.c</code>
<code class="example"></code>
删除你不要的东西。现在你需要用一个新的文件名保存这个文件。":saveas" 命令就是为
此设计的:

<code class="example">        :saveas move.c</code>
<code class="example"></code>
Vim 会用给定的名称保存文件，并开始编辑该文件。这样，下次你用 ":write"，写入的
时候，被写入的就是 "move.c"。而 "copy.c" 不会被改变。
    当你想改变当前文件的文件名，但不想立即保存它，用这个命令:

<code class="example">        :file move.c</code>
<code class="example"></code>
Vim 会把这个文件标记为 "未编辑"。这表示 Vim 知道你现在编辑的文件不是原来那个文
件了。当你写这个文件的时候，你会得到如下错误信息:

<code class="section">        E13: File exists (use ! to override) </code>

这可以避免你不小心覆盖另一个文件。

</section><hr class="doubleline" /><section class=inner>
<h4></h4>下一章:  <a href="usr_08.html#usr_08.txt">usr_08.txt</a>   分割窗口

版权: 参见  <a href="usr_01.html#manual-copyright">manual-copyright</a>   vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
